# chain_value_demo.py
import os
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain.chains import LLMChain


def demonstrate_chain_value():
    """演示Chain的核心价值"""

    print("🎯 Chain核心价值演示")
    print("=" * 50)

    llm = ChatOpenAI(
        api_key=os.getenv("DASHSCOPE_API_KEY"),
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
        model="qwen-turbo"
    )

    # 1. 可复用性：定义一次，处处使用
    print("🔄 可复用性演示：")

    # 创建一个通用的评估Chain
    evaluation_prompt = ChatPromptTemplate.from_template("""
    请评估以下{item_type}：

    内容：{content}
    评估标准：{criteria}

    请给出1-10分的评分和详细理由。
    """)

    evaluation_chain = LLMChain(
        llm=llm,
        prompt=evaluation_prompt,
        output_parser=StrOutputParser()
    )

    # 复用同一个Chain评估不同内容
    test_cases = [
        {
            "item_type": "简历",
            "content": "张三，Java开发工程师，5年经验",
            "criteria": "技能匹配度、经验相关性"
        },
        {
            "item_type": "面试表现",
            "content": "回答问题清晰，技术功底扎实，沟通能力良好",
            "criteria": "技术能力、沟通能力、团队合作"
        },
        {
            "item_type": "项目方案",
            "content": "采用微服务架构，使用Spring Cloud框架",
            "criteria": "技术选型、架构合理性、可维护性"
        }
    ]

    for case in test_cases:
        print(f"\n📋 评估{case['item_type']}：")
        result = evaluation_chain.invoke(case)
        print(f"   结果：{result['text'][:100]}...")

    # 2. 组合性：多个Chain可以组合成复杂流程
    print(f"\n🔗 组合性演示：")

    # 创建多个专用Chain
    info_extraction_prompt = ChatPromptTemplate.from_template("""
    从以下简历中提取基本信息：{resume}
    请用JSON格式输出：姓名、技能、经验年限
    """)

    info_extraction_chain = LLMChain(
        llm=llm,
        prompt=info_extraction_prompt,
        output_parser=StrOutputParser()
    )

    skill_rating_prompt = ChatPromptTemplate.from_template("""
    基于简历信息评估技能水平：{extracted_info}
    请给出技能评分(1-10)和详细分析。
    """)

    skill_rating_chain = LLMChain(
        llm=llm,
        prompt=skill_rating_prompt,
        output_parser=StrOutputParser()
    )

    # 演示Chain组合（简化版）
    sample_resume = "李工程师，精通Java、Spring Boot，有5年开发经验"

    # 步骤1：信息提取
    extracted = info_extraction_chain.invoke({"resume": sample_resume})
    print(f"   步骤1结果：{extracted['text'][:80]}...")

    # 步骤2：技能评估
    skill_result = skill_rating_chain.invoke({"extracted_info": extracted['text']})
    print(f"   步骤2结果：{skill_result['text'][:80]}...")

    # 3. 标准化：统一的接口和错误处理
    print(f"\n📏 标准化接口演示：")
    print("   所有Chain都有统一的invoke()方法")
    print("   统一的输入输出格式")
    print("   统一的错误处理机制")


# 运行演示
demonstrate_chain_value()
